/**
*
*
*\author Isabel Martín Herrero 48539974 S
*
*
**/

#include <iostream>
#include <sstream>
#include "Figura2D.h"


/**
*\file Circulo.h
*\brief Archivo .h de la clase Circulo
*Archivo que contiene la declaración la clase Circulo
*
**/

using namespace std;

#ifndef _JIRAFA_H_
#define _JIRAFA_H_

/** \brief Clase Circulo
 *
 * La clase Circulo permite crear, destruir y modificar objetos de tipo Círculo.Un objeto Círculo  tiene los atributos privados radio (float) y centro (Coordenada)
 * La clase Círculo es amiga de ostream, y hereda de Figura2D
 */

class Circulo: public Figura2D
{
	/** \brief Sobrecarga del operador salida.
	*
	* Función amiga. Sobrecarga el operador salida para que defina la linea con la sintaxis SVG para poder pintar un círculo
	* \param os Toma como parámetro un objeto de tipo flujo de salida
	* \param c Círculo que se escribirá en el fichero SVG
	* \return Devuelve el objeto ostream& que contendrá la sintaxis SVG
	*/
	friend ostream& operator<<(ostream& os, const Circulo& c);
	private:
		/** \brief Miembro Radio.
		*
		* Float radio, que contiene el radio del objeto círculo.
		*/
		float radio;
	
	public:
	
		/** \brief Constructor de Circulo.
		*
		* Crea un objeto de tipo Circulo con los parámetros coordenada, radio, grosor, color, y color de linea;
		*/
		Circulo( Coordenada= (0.0,0.0), float= 1.0, int =1, Color =black, Color =none);
		
		/** \brief Contructor de copia de  Círculo.
		* Crea un objeto de tipo Círculo con los atributos al mismo valor que el que se le pasa como parámetro.
		* \param nc Un objeto de tipo círculo, que será el que se copie en el nuevo objeto.
		*/
		Circulo(const Circulo& nc);
		
		/** \brief Destructor de Círculo.
		*
		* Libera la memoria ocupada por un objeto de tipo Círculo
		*/
		~Circulo();
		
		/** \brief Operador asignación de Círculo.
		*
		* Asigna a los atributos de un objeto de tipo Círculo el mismo valor que los de otro Círculo.
		* \param nc Círculo del que tomará los valores el objeto que invoca al método
		* \return Devuelve el círculo que invoca al método modificado.
		*/
		Circulo& operator=(const Circulo& nc);
		
		/** \brief  Método getCentro.
		*
		* Devuelve el valor del centro del círculo.
		* \return Devuelve un objeto de tipo coordenada, que es el centro del círculo que invoca al método .
		*/
		Coordenada getCentro() const {return getOrigen();};
		
		/** \brief Método getRadio.
		*
		* Devuelve el valor del radio del círculo.
		* \return Devuelve un float con el valor del radio .
		*/
		float getRadio() const {return radio;};
		
		/** \brief Método setRadio.
		*
		* Asigna al radio del Círculo que lo invoca el valor del radio pasado por parámetro
		* \param nc El radio del objeto círculo que invoca  a este método toma el valor de pradio
		* \return Devuelve void, ya que simplemente es una modificadora .
		*/
		void setRadio(float nc)
		{ 
			if(nc>=0)
				radio=nc; 
			else 
				throw ExcepcionValorNoValido(nc,"debe ser positivo o cero");
		};
		
		/** \brief Método pintar.
		*
		* Define la línea con la sintaxis SVG para poder dibujar un círculo
		* \param os Toma como parametro un objeto de tipo flujo de salida.
		* \return Devuelve void.
		*/
		void pintar(ostream& os) const;
		
		/** \brief Método leeEntrada.
		*
		* Lee la procesa la entrada proporcionada;
		*/
		void leeEntrada(istream&);
		
		/** \brief Método clonar.
		*
		* Crea un nuevo circulo
		*/
		Circulo* clonar() const;
		
		Circulo* duplicar(const Coordenada& nuevoOrigen);
		
		/** \brief Método escalar.
		*
		* Escala la figura
		*/
		void escalar(float=100.0);
		
};

#endif
